#define DEBUG
#include <cstdio>

using namespace std;

const int maxn=2000;

int min(int a, int b) {
  return a<b ? a : b;
}

class Graph {
public:
  int in[2*maxn-1], out[2*maxn-1], fa[2*maxn-1], s[maxn+1], t[maxn+1];

  void init(int n) {
    for (int i=1; i<=n*2-1; i++) {
      in[i] = out[i] = 0;
      fa[i] = i;
    }
    for (int i=1; i<=n; i++) {
      s[i] = t[i] = 0;
    }
  }

  void merge(int a, int b) {
    int x=getFa(a), y=getFa(b);
    if (x!=y) {
      out[a]++, in[b]++;
      fa[x] = y;
    }
  }

  int getFa(int x) {
    return fa[x]==x ? x : (fa[x] = getFa(fa[x]));
  }
};

class Tree {
public:
  Graph g;
  int n, m, ind[maxn+1], to[2*maxn-1], link[2*maxn-1];

  bool check(int o, int s, int t, int u, int v) {
    if (s && (g.in[s] || g.getFa(v)==s)) {
      return false;
    }
    if (t && (g.out[t] || g.getFa(u)==t)) {
      return false;
    }
    if (u && v) {
      if ((s && t && g.getFa(s)==g.getFa(t)) || g.in[v] || g.out[u] || g.getFa(u)==g.getFa(v)) {
	return false;
      }
    }
    if (s && t && (g.getFa(s)==g.getFa(t) || (u && v && g.getFa(u)==g.getFa(s) && g.getFa(v)==g.getFa(t)))) {
      // if (g.out[s]!=1 || g.in[t]!=1) {
      // 	return false;
      // }
      for (int i=ind[o]; i; i=link[i]) {
	if (i!=s && i!=t && ((i==v ? g.in[i]!=0 : g.in[i]!=1) || (i==u ? g.out[i]!=0 : g.out[i]!=1))) {
	  return false;
	}
      }
    }
    return true;
  }

  void init(int n) {
    g.init(n);
    this->n = n, m = 1;
    for (int i=1; i<=n; i++) {
      ind[i] = 0;
    }
  }

  void addSide(int u, int v) {
    m++;
    to[m] = v;
    link[m] = ind[u];
    ind[u] = m;
  }

  int findAns(int o, int s) {
    int ret=n+1;
    for (int i=ind[o]; i; i=link[i]) {
      if (i!=s) {
	bool flag=true;
	if (!s) {
	  flag = flag && !g.s[o] && !g.in[i] && check(o, i, g.t[o], 0, 0);
	} else {
	  flag = flag && check(o, g.s[o], g.t[o], s, i);
	}
	if (flag) {
	  ret = min(ret, findAns(to[i], i^1));
	}
      }
    }
    if (!g.t[o] && s && !g.out[s]) {
      if (check(o, g.s[o], s, 0, 0)) {
	ret = min(ret, o);
      }
    }
    return ret;
  }

  bool change(int o, int s, int target) {
    if (o==target) {
      g.t[o] = s;
      return true;
    }
    for (int i=ind[o]; i; i=link[i]) {
      if (i!=s) {
	if (change(to[i], i^1, target)) {
	  if (!s) {
	    g.s[o] = i;
	  } else {
	    g.merge(s, i);
	  }
	  return true;
	}
      }
    }
    return false;
  }
};

int main() {
  freopen("tree.in", "r", stdin);
  freopen("tree.out", "w", stdout);

  int t;
  scanf("%d", &t);
  for (int ti=1; ti<=t; ti++) {
    static Tree tree;
    int n;
    scanf("%d", &n);
    tree.init(n);
    static int a[maxn+1];
    for (int i=1; i<=n; i++) {
      scanf("%d", a+i);
    }
    if (n==1) {
      printf("1\n");
      continue;
    }
    for (int i=1; i<n; i++) {
      int x, y;
      scanf("%d %d", &x, &y);
      tree.addSide(x, y);
      tree.addSide(y, x);
    }

    static int ans[maxn+1];
    for (int i=1; i<=n; i++) {
      ans[i] = tree.findAns(a[i], 0);
      tree.change(a[i], 0, ans[i]);
    }

    for (int i=1; i<=n; i++) {
      printf("%d ", ans[i]);
    }
    printf("\n");
  }

  fclose(stdin);
  fclose(stdout);
  return 0;
}
